//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Lock
// 文件名   : HierarchicalMutex.h
// 作者     : Aiye
// 日期     : 2025/9/19 07:14
// 邮箱     : 2878548868@qq.com
// 摘要     : 层级锁
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef LOCK_HIERARCHICALMUTEX_H
#define LOCK_HIERARCHICALMUTEX_H

#include <mutex>
#include <stdexcept>
#include <climits>

class HierarchicalMutex
{
private:
    std::mutex internal_mutex_;                      // 实际的互斥锁
    unsigned long const hierarchy_value_;            // 当前锁的层级值
    unsigned long previous_hierarchy_value_;         // 保存上一个层级值

    // 线程局部存储：记录当前线程持有的最低层级值
    static thread_local unsigned long this_thread_hierarchy_value_;

    // 检查层级违规：新锁的层级必须低于当前持有的最低层级
    void check_for_hierarchy_violation() const
    {
        if (this_thread_hierarchy_value_ <= hierarchy_value_)
        {
            throw std::logic_error("Mutex hierarchy violated: attempting to lock higher or equal level mutex");
        }
    }

    // 更新线程的当前层级值
    void update_hierarchy_value()
    {
        previous_hierarchy_value_ = this_thread_hierarchy_value_;
        this_thread_hierarchy_value_ = hierarchy_value_;
    }

public:
    // 构造函数：指定层级值
    explicit HierarchicalMutex(unsigned long hierarchy_value)
        : hierarchy_value_(hierarchy_value), previous_hierarchy_value_(0)
    {
    }

    // 禁用拷贝构造和赋值操作
    HierarchicalMutex(const HierarchicalMutex&) = delete;
    HierarchicalMutex& operator=(const HierarchicalMutex&) = delete;

    // 加锁操作
    void lock()
    {
        check_for_hierarchy_violation();    // 检查层级规则
        internal_mutex_.lock();             // 获取实际锁
        update_hierarchy_value();           // 更新层级状态
    }

    // 解锁操作
    void unlock()
    {
        // 确保解锁的是当前持有的锁
        if (this_thread_hierarchy_value_ != hierarchy_value_)
        {
            throw std::logic_error("Mutex hierarchy violated: unlocking wrong mutex");
        }

        // 恢复到上一个层级值
        this_thread_hierarchy_value_ = previous_hierarchy_value_;
        internal_mutex_.unlock();
    }

    // 尝试加锁
    bool try_lock()
    {
        check_for_hierarchy_violation();
        if (internal_mutex_.try_lock())
        {
            update_hierarchy_value();
            return true;
        }
        return false;
    }

    // 获取层级值
    [[nodiscard]] unsigned long get_hierarchy_value() const noexcept
    {
        return hierarchy_value_;
    }

    // 获取当前线程的层级值（用于调试）
    static unsigned long get_thread_hierarchy_value() noexcept
    {
        return this_thread_hierarchy_value_;
    }
};

// 初始化线程局部变量为最大值（最高层级）
thread_local unsigned long HierarchicalMutex::this_thread_hierarchy_value_(ULONG_MAX);

// 预定义的层级常量
namespace hierarchy_levels
{
    constexpr unsigned long SYSTEM_LEVEL = 10000;      // 系统级
    constexpr unsigned long NETWORK_LEVEL = 8000;      // 网络层
    constexpr unsigned long DATABASE_LEVEL = 6000;     // 数据库层
    constexpr unsigned long SERVICE_LEVEL = 4000;      // 服务层
    constexpr unsigned long BUSINESS_LEVEL = 2000;     // 业务层
    constexpr unsigned long UI_LEVEL = 1000;           // 界面层
}

#endif //LOCK_HIERARCHICALMUTEX_H
